package com.hejjon.core.enumer;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author: cs
 * @date: 2025-05-16 10:27:22
 * @since: 1.0
 */
@Getter
public enum JdbcTypeEnum {

    /**
     * 字符串
     */
    VARCHAR("VARCHAR",   "字符串"),

    /**
     * 长文本
     */
    LONGTEXT("LONGTEXT","长文本"),

    /**
     * 整型
     */
    INT("INT", "整数"),

    /**
     * 长整型
     */
    BIGINT("BIGINT", "长整数"),

    /**
     * 小数
     */
    DOUBLE("DOUBLE","小数"),


    /**
     * 日期
     */
    DATE("DATE", "日期"),

    /**
     * 日期时间
     */
    DATETIME("DATETIME", "日期时间");


    /**
     * 名称 用于存数据库
     */
    private final String code;


    /**
     * 标签 用于显示
     */
    private final String name;

    JdbcTypeEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }

    /**
     * 获取名称列表
     * @return
     */
    public static List<String> getNameList() {
        List<String> nameList = new ArrayList<>();
        for (JdbcTypeEnum value : JdbcTypeEnum.values()) {
            nameList.add(value.getName());
        }
        return nameList;
    }

    /**
     * 获取标签列表
     * @return
     */
    public static List<String> getCodeList() {
        List<String> nameList = new ArrayList<>();
        for (JdbcTypeEnum value : JdbcTypeEnum.values()) {
            nameList.add(value.getCode());
        }
        return nameList;
    }

    /**
     * 根据 name 获取名称
     * @param code
     * @return
     */
    public static String getNameByCode(String code) {
        for (JdbcTypeEnum value : JdbcTypeEnum.values()) {
            if (value.getCode().equals(code)) {
                return value.getName();
            }
        }
        return "";
    }

    /**
     * 获取所有实例转成json数组
     * @return
     */
    public static JSONArray listToJsonArray() {
        JSONArray array = new JSONArray();
        for (JdbcTypeEnum value : JdbcTypeEnum.values()) {
            JSONObject item = new JSONObject();
            item.put("code", value.getCode());
            item.put("name", value.getName());
            array.add(item);
        }
        return array;
    }

    /**
     * 根据名称获取枚举实例
     * @param code code
     * @return a
     */
    public static JdbcTypeEnum getInstance(String code) {
        for (JdbcTypeEnum value : JdbcTypeEnum.values()) {
            if (value.getCode().equals(code)) {
                return value;
            }
        }
        return VARCHAR;
    }


    public static Map<String, String> toMap() {
        return Arrays.stream(JdbcTypeEnum.values()).collect(Collectors.toMap(JdbcTypeEnum::getCode, JdbcTypeEnum::getName));
    }

    public static String getJavaTypeBy(JdbcTypeEnum jdbcType) {
        switch (jdbcType) {
            case VARCHAR:
            case LONGTEXT:
                return "String";
            case DATE:
            case DATETIME:
                return "Date";
            case DOUBLE:
                return "Double";
            case BIGINT:
                return "Long";
        }
        return "String";
    }



}
